{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Regularization and Cross-Validation\n",
    "*Complete and hand in this completed worksheet (including its outputs and any supporting code outside of the worksheet) with your assignment submission. Please check the pdf file for more details.*\n",
    "\n",
    "In this exercise you will:\n",
    "    \n",
    "- implement **Ridge Regression** to control overfitting\n",
    "- implement **Logistic Regression with regularization** to control overfitting \n",
    "- implement **Cross-Validation** to control overfitting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import scipy.io as sio\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "digit_train = sio.loadmat('digit_train')\n",
    "X = digit_train['X']\n",
    "y = digit_train['y']\n",
    "digit_test = sio.loadmat('digit_test')\n",
    "X_test = digit_test['X_test']\n",
    "y_test = digit_test['y_test']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def show_digit(fea):\n",
    "    plt.rcParams['figure.figsize'] = (10.0, 8.0)\n",
    "    idx = np.random.permutation(X.shape[1])\n",
    "    fea = fea[:, idx[:100]]\n",
    "    faceW = 28\n",
    "    faceH = 28\n",
    "    numPerLine = 20\n",
    "    ShowLine = 4\n",
    "    Y = np.zeros((faceH * ShowLine, faceW * numPerLine), dtype=np.float)\n",
    "    for i in range(ShowLine):\n",
    "        for j in range(numPerLine):\n",
    "            Y[i * faceH:(i + 1) * faceH, j * faceW:(j + 1) * faceW] = fea[:,i * numPerLine + j].reshape((faceH, faceW))            \n",
    "    plt.imshow(Y, cmap='gray')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ridge Regression and LOOCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "22 inf\n",
      "22 22\n",
      "22 22\n",
      "22 22\n",
      "22 22\n",
      "12 22\n",
      "8 12\n",
      "7 8\n",
      "1000.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_digit(X)\n",
    "# Do feature normalization here\n",
    "# begin answer\n",
    "P, N = X.shape\n",
    "X_avg = np.average(X, axis=1).reshape(P, 1)\n",
    "X_std = np.std(X, axis=1).reshape(P, 1)\n",
    "X_std = np.where(X_std == 0,1,X_std)\n",
    "X = (X - X_avg) / X_std\n",
    "# end answer\n",
    "\n",
    "# Do LOOCV\n",
    "lmbdas = np.array([1e-3, 1e-2, 1e-1, 0, 1, 1e1, 1e2, 1e3])\n",
    "lmbda = 0\n",
    "E_val_min = float('inf')\n",
    "\n",
    "from ridge import ridge\n",
    "\n",
    "for i in range(len(lmbdas)):\n",
    "    E_val = 0\n",
    "    for j in range(X.shape[1]):\n",
    "        X_val = X[:, j].reshape(P, 1)\n",
    "        X_val = np.vstack(([[1]], X_val))\n",
    "        y_val = y[0, j]\n",
    "        X_ = np.delete(X, j, axis=1)\n",
    "        y_ = np.delete(y, j)\n",
    "        w = ridge(X_, y_, lmbdas[i])\n",
    "        E_val = E_val + (0 if np.sign(np.matmul(w.T, X_val)) == y_val else 1)\n",
    "    # Update lmbda according validation error\n",
    "    # begin answer\n",
    "    print(E_val, E_val_min)\n",
    "    if E_val < E_val_min:\n",
    "        E_val_min = E_val\n",
    "        lmbda = lmbdas[i]\n",
    "    # end answer\n",
    "print(lmbda)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.01\n",
      "0.055248618784530384\n"
     ]
    }
   ],
   "source": [
    "# Compute training error\n",
    "w = ridge(X, y, lmbda)\n",
    "\n",
    "X_train = np.vstack((np.ones((1, N)), X))\n",
    "train_error = np.sum(np.sign(np.matmul(w.T, X_train)) != y)\n",
    "print(train_error / N)\n",
    "\n",
    "# Do feature normalization to X_test\n",
    "P_t, N_t = X_test.shape\n",
    "X_test_avg = np.average(X_test, axis=1).reshape(P_t, 1)\n",
    "X_test_std = np.std(X_test, axis=1).reshape(P_t, 1)\n",
    "X_test_std = np.where(X_test_std == 0,1,X_test_std)\n",
    "X_test = (X_test - X_test_avg) / X_test_std\n",
    "# Compute test error\n",
    "X_t_test = np.vstack((np.ones((1, N_t)), X_test))\n",
    "test_error = np.sum(np.sign(np.matmul(w.T, X_t_test)) != y_test)\n",
    "print(test_error / N_t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Logistic Regression with Regularization\n",
    "Use the simlimar skeleton code above to implement it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4 inf\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "0.001\n"
     ]
    }
   ],
   "source": [
    "from logistic_r import logistic_r\n",
    "\n",
    "lmbda = 0\n",
    "E_val_min = float('inf')\n",
    "for i in range(len(lmbdas)):\n",
    "    E_val = 0\n",
    "    for j in range(X.shape[1]):\n",
    "        X_val = X[:, j].reshape(P, 1)\n",
    "        X_val = np.vstack(([[1]], X_val))\n",
    "        y_val = y[0, j]\n",
    "        X_ = np.delete(X, j, axis=1)\n",
    "        y_ = np.delete(y, j)\n",
    "        w = logistic_r(X_, y_, lmbdas[i])\n",
    "        E_val = E_val + (0 if np.sign(np.matmul(w.T, X_val)) == y_val else 1)\n",
    "    # Update lmbda according validation error\n",
    "    # begin answer\n",
    "    print(E_val, E_val_min)\n",
    "    if E_val < E_val_min:\n",
    "        E_val_min = E_val\n",
    "        lmbda = lmbdas[i]\n",
    "    # end answer\n",
    "print(lmbda)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0\n",
      "0.051230537418382724\n"
     ]
    }
   ],
   "source": [
    "# Compute training error\n",
    "w = logistic_r(X, y, 0)\n",
    "X_train = np.vstack((np.ones((1, N)), X))\n",
    "train_error = np.sum(np.sign(np.matmul(w.T, X_train)) != y)\n",
    "print(train_error / N)\n",
    "\n",
    "# Compute test error\n",
    "X_t_test = np.vstack((np.ones((1, N_t)), X_test))\n",
    "test_error = np.sum(np.sign(np.matmul(w.T, X_t_test)) != y_test)\n",
    "print(test_error / N_t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
